package com.coffee.wx.uitls.wx;

import cn.hutool.core.lang.Console;
import cn.hutool.core.map.MapUtil;
import cn.hutool.json.JSONUtil;
import com.coffee.wx.enums.QrCodeTypeEnum;
import com.coffee.wx.uitls.SendHttpUtils;
import com.coffee.wx.uitls.TokenUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * 生成微信二维码
 */
public class WxQrCodeUtils {

    private static final String URL_PREFIX = "https://api.weixin.qq.com/cgi-bin";

    // 获取二维码
    private static final String QRCODE_URL = "/qrcode/create?access_token=%s";

    // 通过ticket换取二维码
    private static final String SHOW_QRCODE_URL = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=%s";

    /**
     * 创建二维码
     *
     * @param qrCodeTypeEnum 二维码类型
     * @param sceneKey       场景值ID
     * @param expireSeconds  二维码有效时间
     *                       单位：秒
     *                       最大值：2592000秒（即30天）
     *                       0时，为永久二维码
     * @return 二维码链接
     */
    public static String buildTemporaryQRCode(QrCodeTypeEnum qrCodeTypeEnum, String sceneKey, int expireSeconds) {

        Map<String, Object> params = buildQrCodeParams(qrCodeTypeEnum, sceneKey, expireSeconds);

        String response = SendHttpUtils.doPost(URL_PREFIX + String.format(QRCODE_URL, TokenUtils.getAccessToken()), params);

        Map map = JSONUtil.parse(response).toBean(Map.class);

        return String.format(SHOW_QRCODE_URL,
                MapUtil.getStr(map, "ticket", null));
    }

    /**
     * 构建二维码参数
     *
     * @param qrCodeTypeEnum 二维码类型
     * @param sceneKey       场景值ID
     * @param expireSeconds  临时二维码有效时间
     *                       单位：秒
     *                       最大值：2592000秒（即30天）
     *                       0时，为永久二维码
     * @return 构造好的参数
     */
    private static Map<String, Object> buildQrCodeParams(QrCodeTypeEnum qrCodeTypeEnum, String sceneKey, int expireSeconds) {
        HashMap<String, Object> scene = new HashMap<>();
        if (QrCodeTypeEnum.QR_STR_SCENE.equals(qrCodeTypeEnum) || QrCodeTypeEnum.QR_LIMIT_STR_SCENE.equals(qrCodeTypeEnum)) {
            scene.put("scene_str", sceneKey);
        } else {
            scene.put("scene_id", Integer.valueOf(sceneKey));
        }

        Map<String, Object> actionInfo = new HashMap<>();
        actionInfo.put("scene", JSONUtil.parse(scene));
        actionInfo.put("fromOpenId", "13449926488");

        Map<String, Object> params = new HashMap<>();
        params.put("action_name", qrCodeTypeEnum.getValue());
        params.put("action_info", JSONUtil.parse(actionInfo));
        if (expireSeconds > 0) {
            params.put("expire_seconds", expireSeconds);
        }
        return params;
    }
}
